/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cuatroenraya.jugadores;
import cuatroenraya.Jugador;

/**
 *
 * @author Jessi
 */
public class JugadorAlumnoG8V1 extends Jugador {

    public int[] jugar (int tablero[][]){
       
        int[] coordenadasJugada = new int[2];
        int[] coordenadasJugadaOponente = new int[2];
        int[][] tablero2 = new int [8][8];
        int puntajeJugada;
        int puntajeJugadaOponente;
        int puntajeMaximo;
        int puntajeMaximoOponente;

        puntajeJugada=0;
        puntajeJugadaOponente=0;
        puntajeMaximo=0;
        puntajeMaximoOponente=-1;

        //Coordenadas por defecto.
        coordenadasJugada[0] = 3;
        coordenadasJugada[1] = 4;

        
        //Guardo una copia del tablero para ir probando.
        for(int i=0; i<8; i++)
        {
            for(int j=0; j<8; j++)
            {
                tablero2[i][j] = tablero[i][j];
            }
        }
                
        for(int a=0; a<8; a++)
        {
            for(int b=0; b<8; b++)
            {
                //Si está vacío, pongo una ficha y evalúo.
                if (tablero2 [a][b] == 0)
                {
                    //FICHA "1" ---> FICHA PROPIA.
                    tablero2 [a][b] = 1;

                        puntajeJugada = evaluarHorizontalHaciaAdelante (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }

                        puntajeJugada = evaluarVerticalHaciaAdelante (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }

                        puntajeJugada = evaluarDiagonalHaciaAdelante (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }


                        puntajeJugada = evaluarHorizontalHaciaAtras (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }

                        puntajeJugada = evaluarVerticalHaciaAtras (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }

                        puntajeJugada = evaluarDiagonalHaciaAtras (puntajeJugada, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugada > puntajeMaximo)
                        {
                            coordenadasJugada[0] = a;
                            coordenadasJugada[1] = b;
                            puntajeMaximo = puntajeJugada;
                            puntajeJugada = 0;
                        }

                     //Vuelvo el tablero2 al origen para seguir comprobando.
                    tablero2[a][b] = 0;
                }
            }
        }


        //Recorro nuevamente el Tablero para evaluar las jugadas de mi oponente.
        //Esto estaría dentro de la función Heurística.
        for(int a=0; a<8; a++)
        {
            for(int b=0; b<8; b++)
            {
                //Si está vacío, pongo una ficha mía y evalúo.
                if (tablero2 [a][b] == 0)
                {
                    tablero2 [a][b] = 1;

                        puntajeJugadaOponente = evaluarOponenteHorizontalHaciaAdelante (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }


                        puntajeJugadaOponente = evaluarOponenteVerticalHaciaAdelante (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }

                        puntajeJugadaOponente = evaluarOponenteDiagonalHaciaAdelante (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }

                        puntajeJugadaOponente = evaluarOponenteHorizontalHaciaAtras (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }

                        puntajeJugadaOponente = evaluarOponenteVerticalHaciaAtras (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }

                         puntajeJugadaOponente = evaluarOponenteDiagonalHaciaAtras (puntajeJugadaOponente, tablero2, a, b);
                        //Preguntar si el valor actual supera al máximo.
                        if (puntajeJugadaOponente > puntajeMaximoOponente)
                        {
                            coordenadasJugadaOponente[0] = a;
                            coordenadasJugadaOponente[1] = b;
                            puntajeMaximoOponente = puntajeJugadaOponente;
                            puntajeJugadaOponente = 0;
                        }

                   //Vuelvo el tablero2 al origen para seguir comprobando.
                    tablero2[a][b] = 0;
                }

            }
        }

        //Devuelvo el valor de coordenada que quedó guardado,
        //ya que esa es la mejor jugada.
        if (puntajeMaximo >= puntajeMaximoOponente)
        {
            return coordenadasJugada;
        }
        else
        {
            return coordenadasJugadaOponente;
        }

        
        }

   ///EVALUACIONES JUGADAS PROPIAS
    //Jugadas Hacia Adelante
    public int evaluarHorizontalHaciaAdelante (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //HORIZONTAL
        if (j!=7) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((j!=6) && (j!=5))
            {
                //4 en Línea.
                if ((tablero2[i][j+1]==1) && (tablero2[i][j+2]==1) && (tablero2[i][j+3]==1))
                {
                    puntajeJugada = 1000;
                    return puntajeJugada;
                }
            }
            if (j!=5)
            {
                //3 en Línea.
                if ((tablero2[i][j+1]==1) && (tablero2[i][j+2]==1))
                {
                    puntajeJugada = 100;
                    return puntajeJugada;
                }
            }
            //2 en Línea.
            if (tablero2[i][j+1]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }

    public int evaluarVerticalHaciaAdelante (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //VERTICAL
        //4 en Línea.
        if (i!=7) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((i!=6) && (i!=5))
            {
                if ((tablero2[i+1][j]==1) && (tablero2[i+2][j]==1) && (tablero2[i+2][j]==1))
                {
                    puntajeJugada = 1000;
                    return puntajeJugada;
                }
            }
            if (i!=5)
            {
                //3 en Línea.
                if ((tablero2[i+1][j]==1) && (tablero2[i+2][j]==1))
                {
                    puntajeJugada = 100;
                    return puntajeJugada;
                }
            }
            //2 en Línea.
            if (tablero2[i+1][j]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }

    public int evaluarDiagonalHaciaAdelante (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //DIAGONAL
        if ((j!=7) && (i!=7)) //Hago esto para evitar que evalúe fuera de los índices.
        {
          if ((j!=6) && (j!=5) && (i!=6) && (i!=5))
          {
            //4 en Línea.
            if ((tablero2[i+1][j+1]==1) && (tablero2[i+2][j+2]==1) && (tablero2[i+3][j+3]==1))
            {
                puntajeJugada = 1000;
                return puntajeJugada;
            }
          }
          if ((j!=5) && (i!=5))
          {
            //3 en Línea.
            if ((tablero2[i+1][j+1]==1) && (tablero2[i+2][j+2]==1))
            {
                puntajeJugada = 100;
                return puntajeJugada;
            }
          }
            //2 en Línea.
            if (tablero2[i+1][j+1]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }

    //Jugadas Hacia Atrás
    public int evaluarHorizontalHaciaAtras (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //HORIZONTAL
        if (j!=0) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((j!=1) && (j!=2))
            {
                //4 en Línea.
                if ((tablero2[i][j-1]==1) && (tablero2[i][j-2]==1) && (tablero2[i][j-3]==1))
                {
                    puntajeJugada = 1000;
                    return puntajeJugada;
                }
            }
            if (j!=1) 
            {
                //3 en Línea.
                if ((tablero2[i][j-1]==1) && (tablero2[i][j-2]==1))
                {
                    puntajeJugada = 100;
                    return puntajeJugada;
                }
            }
            //2 en Línea.
            if (tablero2[i][j-1]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }

    public int evaluarVerticalHaciaAtras (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //VERTICAL
        //4 en Línea.
        if (i!=0) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((i!=1) && (i!=2))
            {
                if ((tablero2[i-1][j]==1) && (tablero2[i-2][j]==1) && (tablero2[i-2][j]==1))
                {
                    puntajeJugada = 1000;
                    return puntajeJugada;
                }
            }
           if (i!=1)
            {
                //3 en Línea.
                if ((tablero2[i-1][j]==1) && (tablero2[i-2][j]==1))
                {
                    puntajeJugada = 100;
                    return puntajeJugada;
                }
           }
            //2 en Línea.
            if (tablero2[i-1][j]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }

    public int evaluarDiagonalHaciaAtras (int puntajeJugada, int tablero2[][], int i, int j )
    {
        //DIAGONAL
        if ((j!=0) && (i!=0)) //Hago esto para evitar que evalúe fuera de los índices.
        {
          if ((j!=1) && (j!=2) && (i!=1) && (i!=2))
          {
            //4 en Línea.
            if ((tablero2[i-1][j-1]==1) && (tablero2[i-2][j-2]==1) && (tablero2[i-3][j-3]==1))
            {
                puntajeJugada = 1000;
                return puntajeJugada;
            }
          }
          if ((j!=1) && (i!=1))
          {
            //3 en Línea.
            if ((tablero2[i-1][j-1]==1) && (tablero2[i-2][j-2]==1))
            {
                puntajeJugada = 100;
                return puntajeJugada;
            }
          }
            //2 en Línea.
            if (tablero2[i-1][j-1]==1)
            {
                puntajeJugada = 50;
                return puntajeJugada;
            }
        }
        return puntajeJugada;
    }











    ///EVALUACIONES JUGADAS OPONENTE
    //Jugadas Hacia Adelante
    public int evaluarOponenteHorizontalHaciaAdelante (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //HORIZONTAL
        if (j!=7) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((j!=6) && (j!=5))
            {
                //4 en Línea.
                if ((tablero2[i][j+1]==2) && (tablero2[i][j+2]==2) && (tablero2[i][j+3]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
            }
            if (j!=5)
            {
                //3 en Línea.
                if ((tablero2[i][j+1]==2) && (tablero2[i][j+2]==2))
                {
                    puntajeJugadaOponente = 90;
                    return puntajeJugadaOponente;
                }
            }
            //2 en Línea.
            if (tablero2[i][j+1]==2)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }
        }
        return puntajeJugadaOponente;
    }

    public int evaluarOponenteVerticalHaciaAdelante (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //VERTICAL
        //4 en Línea.
        if (i!=7) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((i!=6) && (i!=5)) 
            {
                if ((tablero2[i+1][j]==2) && (tablero2[i+2][j]==2) && (tablero2[i+2][j]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
            }
            if (i!=5) //Hago esto para evitar que evalúe fuera de los índices.
            {
                //3 en Línea.
                if ((tablero2[i+1][j]==1) && (tablero2[i+2][j]==1))
                {
                    puntajeJugadaOponente = 90;
                    return puntajeJugadaOponente;
                }
            }
            //2 en Línea.
            if (tablero2[i+1][j]==1)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }
        }
        return puntajeJugadaOponente;
    }

    public int evaluarOponenteDiagonalHaciaAdelante (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //DIAGONAL
        if ((j!=7) && (i!=7)) //Hago esto para evitar que evalúe fuera de los índices.
        {
          if ((j!=6) && (j!=5) && (i!=6) && (i!=5))
          {
                //4 en Línea.
                if ((tablero2[i+1][j+1]==2) && (tablero2[i+2][j+2]==2) && (tablero2[i+3][j+3]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
          }
          if ((j!=5)&& (i!=5))
          {
            //3 en Línea.
            if ((tablero2[i+1][j+1]==2) && (tablero2[i+2][j+2]==2))
            {
                puntajeJugadaOponente = 90;
                return puntajeJugadaOponente;
            }
          }
            //2 en Línea.
            if (tablero2[i+1][j+1]==2)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }
        }
        return puntajeJugadaOponente;
    }


    //Jugadas Hacia Atrás
    public int evaluarOponenteHorizontalHaciaAtras (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //HORIZONTAL
        if (j!=0) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((j!=1) && (j!=2))
            {
                if ((tablero2[i][j-1]==2) && (tablero2[i][j-2]==2) && (tablero2[i][j-3]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
            }
            if (j!=1)
            {
                //3 en Línea.
                if ((tablero2[i][j-1]==2) && (tablero2[i][j-2]==2))
                {
                    puntajeJugadaOponente = 90;
                    return puntajeJugadaOponente;
                }
            }
            //2 en Línea.
            if (tablero2[i][j-1]==2)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }            
        }            
        return puntajeJugadaOponente;
    }

    public int evaluarOponenteVerticalHaciaAtras (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //VERTICAL
        //4 en Línea.
        if (i!=0) //Hago esto para evitar que evalúe fuera de los índices.
        {
            if ((i!=1) && (i!=2))
            {
                if ((tablero2[i-1][j]==2) && (tablero2[i-2][j]==2) && (tablero2[i-2][j]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
            }
            if (i!=1)
            {
                //3 en Línea.
                if ((tablero2[i-1][j]==2) && (tablero2[i-2][j]==2))
                {
                    puntajeJugadaOponente = 90;
                    return puntajeJugadaOponente;
                }
            }
            //2 en Línea.
            if (tablero2[i-1][j]==2)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }
        }
        return puntajeJugadaOponente;
    }

    public int evaluarOponenteDiagonalHaciaAtras (int puntajeJugadaOponente, int tablero2[][], int i, int j )
    {
        //DIAGONAL
        if ((j!=0) && (i!=0)) //Hago esto para evitar que evalúe fuera de los índices.
        {
          if ((j!=1) && (j!=2) && (i!=1) && (i!=2))
          {
                //4 en Línea.
                if ((tablero2[i-1][j-1]==2) && (tablero2[i-2][j-2]==2) && (tablero2[i-3][j-3]==2))
                {
                    puntajeJugadaOponente = 900;
                    return puntajeJugadaOponente;
                }
          }
          if ((j!=1)&& (i!=1))
          {
            //3 en Línea.
            if ((tablero2[i-1][j-1]==2) && (tablero2[i-2][j-2]==2))
            {
                puntajeJugadaOponente = 90;
                return puntajeJugadaOponente;
            }
          }
            //2 en Línea.
            if (tablero2[i-1][j-1]==2)
            {
                puntajeJugadaOponente = 40;
                return puntajeJugadaOponente;
            }
        }
        return puntajeJugadaOponente;
    }



    public String devolverIntegrantes ()
    {
        return "Casas Ruggieri Jésica - Cortez Noemí Andrea";
    }

        public String devolverCurso ()
    {
        return "Curso 5K4";
    }

     public String devolverGrupo ()
    {
        return "Grupo Nº : Casas Ruggieri Jésica - Cortez Noemí Andrea";
    }



 }